/*
	This file is part of AVRCppLib.

    AVRCppLib is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    AVRCppLib is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with AVRCppLib.  If not, see <http://www.gnu.org/licenses/>.

    Copyright (C) Maxime Lemonnier 2007-2011
 */

#include "SPIMaster.h"

namespace Coms
{

namespace SPI
{

SPIMaster::SPIMaster(SPIHardware * spiHardware, IOAddress slaveSelectPort, IOAddress slaveSelectDDR, uint8_t slaveSelectPinNumber) :
spiHardware(spiHardware), slaveSelectPort(slaveSelectPort), slaveSelectDDR(slaveSelectDDR), slaveSelectPinNumber(slaveSelectPinNumber)
{
	setBit(*slaveSelectDDR, slaveSelectPinNumber);
	setBit(*slaveSelectPort, slaveSelectPinNumber);
}

SPIMaster::~SPIMaster()
{
	// TODO Auto-generated destructor stub
}


Buffer<uint8_t> & SPIMaster::transmitAndReceive(Buffer<uint8_t> & transmitAndReceiveBuffer)
{
	clearBit(*slaveSelectPort, slaveSelectPinNumber); // pull SS low

	for(size_t i = 0; i < transmitAndReceiveBuffer.numberOfElements; i++)
	{
		spiHardware->writeByte(transmitAndReceiveBuffer.buffer[i]);

		while(!spiHardware->readInterruptFlag());

		transmitAndReceiveBuffer.buffer[i] = spiHardware->readByte();
	}

	setBit(*slaveSelectPort, slaveSelectPinNumber); // pull SS high

	return transmitAndReceiveBuffer;
}

}

}
